home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
FM Towns: Software Contest 3
/
FM Towns Software Contest 3.iso
/
exp
/
video_t
/
no1
/
c_sorse
/
ptiff.c
< prev
next >
Wrap
Text File
|
1994-01-07
|
5KB
|
306 lines
#include <stdio.h>
#include <stdlib.h>
#include <mos.h>
#include <egb.h>
#include <strings.h>
#include <conio.h>
#include <tifflib.h>
extern void print();
extern char *guiEgbPtr ;
extern char *getgraph;
#define GETG 512 /* 画面取り込みバッファ */
int modet ;
extern char *gwork;
char mwork[4096];
char palt[ 256*8+4 ] ; /* パレット設定用 */
char fdata[100][160]; /* ロードTIFF データ */
char wdata2[100][160]; /* セーブTIFF データ */
char wzahyo[100][30]; /* セーブTIFF データ */
char para[300];
int gwsize;
int mx,my; /*ヘッダ情報*/
int res;
int bpp ;
int comp,fill ;
int width,length ;
long strip, clut, dw ;
char *gettiff;
extern int menud;
int page=0;
struct {
char *bp ;
short sel ;
short sx,sy,ex,ey ;
} p ; /* EGB_putBlockのパラメータ */
struct {
char *bp ;
short sel ;
short sx,sy,ex,ey ;
} gg ; /* EGB_putBlockのパラメータ */
/* 下請け関数群 */
/* 画面モードの設定 */
int setvmode()
{
switch(bpp ) {
case 1:
case 4:
if(menud!=2)
{
gamen2();
}
break ;
case 8:
if(menud!=0)
{
gamen0();
}
break ;
case 16:
if( width > 320 || length > 240 ) { /* high resolution 32k */
if (menud!=6)
{
gamen6();
}
} else {
if(menud!=6 && menud!=1)
{
gamen1();
}
}
break ;
default: return 0;
}
return modet ;
}
void err()
{
char aaa[200];
char bbb[]="ERROR : ";
strcat(aaa,bbb);
_itoa(tiff_err,bbb,10);
strcat(aaa,bbb);
print(50,160,7,aaa);
return;
}
/*
load TIFF file
TIFFローダメイン
*/
FILE *fp2 ;
int getpict(work, gwsize, name)
char *work;
int gwsize ;
char *name ;
{
if( (fp2 = fopen( name, "rb" )) == NULL ) return( -1 ) ;
fread( gwork, 1, gwsize, fp2 ) ; /* 最初のデータロード */
fclose( fp2 ) ;
/* ヘッダの解析 */
if( TIFF_getHead( gwork, gwsize ) < 0 ) err() ;
/* タグの内容のチェック */
if( ( bpp = TIFF_checkMode( &width,&length,&comp,&fill,&strip,&clut )) < 0 )
err() ;
if( bpp == 24 ) err() ; /* このプログラムではフルカラーデータは扱わない */
modet = bpp ;
setvmode();
/* パレットの設定 */
if( clut != 0 ) {
TIFF_getPal( palt ) ;
EGB_palette( work, 0, palt ) ;
}
res=bpp;
mx=width ;
my=length ;
return 0 ;
}
extern void wait();
/* 展開されたものを表示する */
/* そのまま表示する場合は, EGB_putBlockを使えばよい */
int ss,xx,yy; /* 座標 */
int ff; /* + - のフラグ */
int printg()
{
ff=1;
int sss,xxx,yyy;
do {
MOS_rdpos(&ss,&xx,&yy);
xxx=xx;
yyy=yy;
if(ff==1)
{
gg.bp = getgraph ;
gg.sel = 0x14 ;
gg.sx = xx ;
gg.ex = xx+mx ;
gg.sy = yy;
gg.ey = yy+my;
EGB_getBlock( guiEgbPtr , (char *)&gg ) ;
p.bp = gwork+strip ;
p.sel = 0x14 ;
p.sx = xx ;
p.ex = xx+mx -1 ;
p.sy = yy;
p.ey = yy+my -1 ;
}
else
{
gg.bp = getgraph ;
gg.sel = 0x14 ;
gg.sx = xx-mx ;
gg.ex = xx;
gg.sy = yy-my;
gg.ey = yy;
EGB_getBlock(guiEgbPtr , (char *)&gg ) ;
p.bp = gwork+strip ;
p.sel = 0x14 ;
p.sx = xx-mx ;
p.ex = xx -1 ;
p.sy = yy-my ;
p.ey = yy -1 ;
}
if( modet == 1 )
{
EGB_putBlockColor(guiEgbPtr, 0, (char *)&p ) ;
}
else
{
EGB_putBlock(guiEgbPtr , 0, (char *)&p ) ;
}
if(ss==2) { ff=ff*-1; wait(); }
if(ss==1) break;
int data=1;
do{
data=1;
MOS_rdpos(&ss,&xx,&yy);
if(ss==1) break;
if(ss==2) { ff=ff*-1; wait(); }
if(xxx!=xx || yyy!=yy) data=2;
}while(data==1);
if(ss==1) break;
if( modet == 1 )
{
EGB_putBlockColor(guiEgbPtr, 0, (char *)&gg ) ;
}
else
{
EGB_putBlock( guiEgbPtr , 0, (char *)&gg ) ;
}
}while(ss!=1);
return 0 ;
}
void addat(char *fail, int i)
{
char suux[10];
char suuy[10];
char spa[]=" ";
char lend[5];
lend[0]=0x0a; lend[1]='\0';
wdata2[i][0]='\0';
strcat(wdata2[i],"/LOAD T ");
strcat(wdata2[i],fail);
wzahyo[i][0]='\0';
strcat(wzahyo[i],"/TIFF ");
if(ff==1)
{
_itoa(xx,suux,10);
_itoa(yy,suuy,10);
}
else {
_itoa(xx-mx,suux,10);
_itoa(yy-my,suuy,10);
}
strcat(wzahyo[i],suux);
strcat(wzahyo[i],spa);
strcat(wzahyo[i],suuy);
}
void tiff(char *fail, int i)
{
int mojis,chg;
int l,error;
gwsize = 512*1024 ;
char lend[5];
lend[0]=0x0a; lend[1]='\0';
int lot;
error=getpict(guiEgbPtr, gwsize, fail);
if(error==0)
{
printg();
addat(fail,i);
}
else {
wdata2[i][0]=0x0d; wdata2[i][1]=0x0a;
}
}
int ldram(int x, int y)
{
p.bp = gwork+strip ;
p.sel = 0x14 ;
p.sx = x ;
p.ex = x+mx -1 ;
p.sy = y;
p.ey = y+my -1 ;
if( modet == 1 )
{
EGB_putBlockColor(guiEgbPtr, 0, (char *)&p ) ;
}
else
{
EGB_putBlock(guiEgbPtr , 0, (char *)&p ) ;
}
}